package com.edu.exam.entity.grading.analysis;

import com.edu.exam.enums.grading.ResultFormat;
import com.edu.exam.enums.grading.ResultStatus;
import com.edu.exam.enums.grading.ResultType;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 分析结果实体类
 * 所属模块：E-03 成绩分析模块
 *
 * <p>分析结果实体用于存储和管理成绩数据分析结果信息，包含
 * 结果数据、统计摘要、元数据等功能。支持多种结果类型和数据格式。</p>
 *
 * <p>核心功能：
 * - 结果存储：存储各种分析结果数据
 * - 结果分类：支持多种结果类型分类
 * - 统计摘要：提供结果统计信息
 * - 数据验证：确保结果数据完整性
 * - 版本管理：支持结果数据版本控制</p>
 *
 * @author 系统生成
 * @version 1.0
 * @since 2025-11-10
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@Entity
public class AnalysisResult {

    /**
     * 结果唯一标识
     */
    @Id
    @Column(name = "id", length = 64)
    private String id;

    /**
     * 关联任务ID
     *
     * <p>对应的分析任务ID。</p>
     */
    @Column(name = "task_id", nullable = false, length = 64)
    private String taskId;

    /**
     * 结果类型
     *
     * <p>分析结果的类型，与任务类型对应。</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "result_type", nullable = false, length = 32)
    private ResultType resultType;

    /**
     * 结果数据
     *
     * <p>JSON格式的分析结果数据。</p>
     */
    @Column(name = "result_data", columnDefinition = "TEXT")
    private String resultData;

    /**
     * 结果摘要
     *
     * <p>分析结果的简要描述和关键指标。</p>
     */
    @Column(name = "result_summary", columnDefinition = "TEXT")
    private String resultSummary;

    /**
     * 数据量
     *
     * <p>参与分析的数据记录数量。</p>
     */
    @Column(name = "data_count")
    private Integer dataCount = 0;

    /**
     * 分析时间
     *
     * <p>结果生成的分析时间。</p>
     */
    @Column(name = "analysis_time")
    private LocalDateTime analysisTime;

    /**
     * 结果名称
     *
     * <p>结果的显示名称。</p>
     */
    @Column(name = "result_name", length = 255)
    private String resultName;

    /**
     * 结果描述
     *
     * <p>结果的详细描述信息。</p>
     */
    @Column(name = "result_description", columnDefinition = "TEXT")
    private String resultDescription;

    /**
     * 数据范围
     *
     * <p>JSON格式的数据范围信息。</p>
     */
    @Column(name = "data_scope", columnDefinition = "TEXT")
    private String dataScope;

    /**
     * 分析参数
     *
     * <p>JSON格式的分析参数配置。</p>
     */
    @Column(name = "analysis_parameters", columnDefinition = "TEXT")
    private String analysisParameters;

    /**
     * 关键指标
     *
     * <p>JSON格式的关键分析指标。</p>
     */
    @Column(name = "key_metrics", columnDefinition = "TEXT")
    private String keyMetrics;

    /**
     * 数据质量评分
     *
     * <p>分析数据的质量评分（0-100）。</p>
     */
    @Column(name = "data_quality_score", precision = 5, scale = 2)
    private BigDecimal dataQualityScore;

    /**
     * 结果置信度
     *
     * <p>分析结果的置信度（0-1）。</p>
     */
    @Column(name = "confidence_level", precision = 3, scale = 2)
    private BigDecimal confidenceLevel;

    /**
     * 结果状态
     *
     * <p>结果的当前状态。</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "result_status", nullable = false, length = 20)
    private ResultStatus resultStatus = ResultStatus.VALID;

    /**
     * 错误信息
     *
     * <p>分析过程中的错误或警告信息。</p>
     */
    @Column(name = "error_message", columnDefinition = "TEXT")
    private String errorMessage;

    /**
     * 警告信息
     *
     * <p>分析过程中的警告信息。</p>
     */
    @Column(name = "warning_message", columnDefinition = "TEXT")
    private String warningMessage;

    /**
     * 数据来源
     *
     * <p>分析数据的来源信息。</p>
     */
    @Column(name = "data_source", length = 255)
    private String dataSource;

    /**
     * 结果格式
     *
     * <p>结果数据的格式类型。</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "result_format", length = 20)
    private ResultFormat resultFormat = ResultFormat.JSON;

    /**
     * 文件路径
     *
     * <p>结果文件的存储路径。</p>
     */
    @Column(name = "file_path", length = 500)
    private String filePath;

    /**
     * 文件大小
     *
     * <p>结果文件的大小（字节）。</p>
     */
    @Column(name = "file_size")
    private Long fileSize;

    /**
     * 压缩标志
     *
     * <p>是否压缩存储结果数据。</p>
     */
    @Column(name = "is_compressed")
    private Boolean isCompressed = false;

    /**
     * 加密标志
     *
     * <p>是否加密存储结果数据。</p>
     */
    @Column(name = "is_encrypted")
    private Boolean isEncrypted = false;

    /**
     * 缓存标志
     *
     * <p>是否缓存结果数据。</p>
     */
    @Column(name = "is_cached")
    private Boolean isCached = false;

    /**
     * 缓存过期时间
     *
     * <p>缓存数据的过期时间。</p>
     */
    @Column(name = "cache_expiry_time")
    private LocalDateTime cacheExpiryTime;

    /**
     * 访问次数
     *
     * <p>结果被访问的次数。</p>
     */
    @Column(name = "access_count")
    private Integer accessCount = 0;

    /**
     * 最后访问时间
     *
     * <p>结果最后被访问的时间。</p>
     */
    @Column(name = "last_access_time")
    private LocalDateTime lastAccessTime;

    /**
     * 标签
     *
     * <p>结果的分类标签。</p>
     */
    @Column(name = "result_tags", length = 500)
    private String resultTags;

    /**
     * 元数据
     *
     * <p>JSON格式的结果元数据。</p>
     */
    @Column(name = "metadata", columnDefinition = "TEXT")
    private String metadata;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreationTimestamp
    @Column(name = "created_time", nullable = false, updatable = false)
    private LocalDateTime createdTime;

    /**
     * 更新时间
     */
    @UpdateTimestamp
    @Column(name = "updated_time", nullable = false)
    private LocalDateTime updateTime;

    /**
     * 创建人ID
     */
    @Column(name = "created_by", length = 50)
    private String createdBy;

    /**
     * 更新人ID
     */
    @Column(name = "updated_by", length = 50)
    private String updatedBy;

    /**
     * 版本号（乐观锁）
     */
    @Version
    @Column(name = "version")
    private Integer version = 0;

    /**
     * 逻辑删除标记
     */
    @Column(name = "is_deleted", nullable = false)
    private Boolean isDeleted = false;
}